import Module from './module';
import { forEachValue } from "../utils";
class ModuleCollection {
  constructor(options) {
    this.register([], options);
  }

  //   /**
  //    * 把用户传递的参数构建符合编码要求的树形结构核心，
  //    * 已经是父子关系了，想在上面添加一些属性，以后有父子关系都可以这么搞
  //    * 
  //    * @param {*} path 是构建与模块形成父子关系的栈结构
  //    * @param {*} rootModule 用户的参数
  //    */
  //   register(path, rootModule) {
  //     const module = {
  //       _raw: rootModule,
  //       _children: {},
  //       state: rootModule.state,
  //     };

  //     if (path.length === 0) {
  //       this.root = module;
  //     } else {
  //       // 形成父子关系的核心，先找到父亲
  //       const parent = path.slice(0, -1).reduce((memo, current) => {
  //         return memo._children[current];
  //       }, this.root);

  //       parent._children[path[path.length - 1]] = module;
  //     }

  //     // 用户传递了 modules
  //     if (rootModule.modules) {
  //       forEach(rootModule.modules, (moduleName, moduleValue) => {
  //         this.register(path.concat(moduleName), moduleValue);
  //       })
  //     }
  //   }

  /**
   * 把用户传递的参数构建符合编码要求的树形结构核心，
   * 已经是父子关系了，想在上面添加一些属性，以后有父子关系都可以这么搞
   * 
   * @param {*} path 是构建与模块形成父子关系的栈结构
   * @param {*} rootModule 用户的参数
   */
  register(path, rootModule) {
    const module = new Module(rootModule);

    if (path.length === 0) {
      this.root = module;
    } else {
      // 形成父子关系的核心，先找到父亲
      const parent = path.slice(0, -1).reduce((memo, current) => {
        return memo.getChild(current);
      }, this.root);

      parent.addChild(path[path.length - 1], module);
    }

    // 用户传递了 modules
    if (rootModule.modules) {
      forEachValue(rootModule.modules, (moduleName, moduleValue) => {
        this.register(path.concat(moduleName), moduleValue);
      })
    }
  }
}

export default ModuleCollection;